package util;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

import modelUtil.Configuracion;
import modelUtil.Util;
import paginas.PaginaEntornoCreacionTeclados;
import plantilla.BotonTO;
import plantilla.PlantillaTO;
import AccionBoton.AccionArrastrarBoton;
import AccionBoton.AccionSeleccionPanelEliminado;
import AccionBoton.AccionSoltarBoton;

public class TecladoPreview extends Teclado{


	private static final long serialVersionUID = 1L;
	private PlantillaTO _plantilla;
	private List <BotonTO> _listaBotones;
	private PaginaEntornoCreacionTeclados _frame;
	private GridBagLayout gridbag = new GridBagLayout();
	private List<PanelBotonEliminado> _botonesEliminados;
	private BotonPersonalizado botonArrastrado;
	private Boolean arrastrando = false;
	private Point origen = new Point();
	private String os;
	
	public TecladoPreview(JFrame contenedor, PlantillaTO plantilla, boolean barrido, int tiempoBarrido, boolean limpiarFrame, PaginaEntornoCreacionTeclados frame, List<PanelBotonEliminado>botonesEliminados){
		 super(contenedor, barrido, tiempoBarrido, limpiarFrame);
		 _botonesEliminados = botonesEliminados;
		 _plantilla = plantilla;
		 _frame = frame;
		 _listaBotones = _plantilla.getListaBotones();
		 _numFilas = new Integer(_plantilla.getNumeroFilas()).intValue(); 
		 _numColumnas = new Integer(_plantilla.getNumeroColumnas()).intValue();
		 os = System.getProperty("os.name");
		 init();
		 pintarTeclado();
		 _frame.pack();
		 _frame.repaint();
		 _contenedor.pack();
		 _contenedor.repaint();
		 _contenedor.setAlwaysOnTop(true);
	}
	
	
	public TecladoPreview(JFrame contenedor, PlantillaTO plantilla, boolean barrido, int tiempoBarrido, boolean limpiarFrame, PaginaEntornoCreacionTeclados frame){
		 super(contenedor, barrido, tiempoBarrido, limpiarFrame);
		 

		 _frame = frame;
		 _botonesEliminados =frame.getBotonesEliminados();
		 _plantilla = plantilla;
		 _botonesEliminados = detectarHuecos(_plantilla);

		 _frame.setBotonesEliminados(_botonesEliminados);
		 _listaBotones = _plantilla.getListaBotones();
		 _numFilas = new Integer(_plantilla.getNumeroFilas()).intValue(); 
		 _numColumnas = new Integer(_plantilla.getNumeroColumnas()).intValue();
		 os = System.getProperty("os.name");
		 init();
		 pintarTeclado();
		 _frame.pack();
		 _frame.repaint();
		 _contenedor.pack();
		 _contenedor.repaint();
		 _contenedor.setAlwaysOnTop(true);
	}
	
	
	
    public void init(){
    	Toolkit tk = Toolkit.getDefaultToolkit();
   	 	Dimension screenSize = tk.getScreenSize();
   	    int altoDock = (new Double(screenSize.getWidth()*0.045)).intValue();
   	 	
   	 	_contenedor.setPreferredSize(new Dimension(new Integer(_plantilla.getAnchoTeclado()), new Integer(_plantilla.getAltoTeclado())));
   	 	
   	 	String posicion = _plantilla.getPosicionInicial();
   	 	
   	 	_contenedor.setLayout(null);
   	 	
   	 	if(posicion.equals("SUPERIOR")){
   	   	 		_contenedor.setPreferredSize(new Dimension(new Double(screenSize.getWidth()).intValue(), new Integer(_plantilla.getAltoTeclado())));
	    	 	_contenedor.setLocation(0,130);

   	 		
   	 	}else{
   	 		if (posicion.equals("INFERIOR")){
   	 			_contenedor.setPreferredSize(new Dimension(new Double(screenSize.getWidth()).intValue(), new Integer(_plantilla.getAltoTeclado())));
	    	 	if(os.equalsIgnoreCase("Mac OS X"))
	    	 		_contenedor.setLocation(0,screenSize.height - new Integer(_plantilla.getAltoTeclado()) - altoDock);
	    	 	else
	    	 	_contenedor.setLocation(0,screenSize.height - new Integer(_plantilla.getAltoTeclado()));
	    	 	
   	   	 		_contenedor.setPreferredSize(new Dimension(new Double(screenSize.getWidth()).intValue(), new Integer(_plantilla.getAltoTeclado())));

   	 			
   	 		}else{
   	 			
   	 			if(posicion.equals("PANTALLA_COMPLETA")){
   	 				_contenedor.setPreferredSize(new Dimension(new Double(screenSize.getWidth()).intValue(), new Double(screenSize.getHeight()).intValue()-130-altoDock));
   		    	 	_contenedor.setLocation(0,130);
   	 				
   	 			}else{
   	 				
   	 				if(posicion.equals("LIBRE")){
   	 		   	 	
   	 					_contenedor.setPreferredSize(new Dimension(new Integer(_plantilla.getAnchoTeclado()), new Integer(_plantilla.getAltoTeclado())));
   	   		    	 	_contenedor.setLocation((new Double((screenSize.getWidth()/2)-(new Integer(_plantilla.getAnchoTeclado())/2))).intValue(),(new Double((screenSize.getHeight()/2)-(new Integer(_plantilla.getAltoTeclado())/2))).intValue());

   	 				}
   	 			}
   	 			
   	 		}
   	 	}

        
        GridBagConstraints c = new GridBagConstraints();
     	c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;
        c.weighty = 1.0;
        setLayout(gridbag);


        List <BotonPersonalizado> botones = new ArrayList<BotonPersonalizado>();
        _matrizBotones = new BotonPersonalizado [_numFilas][_numColumnas];
		int anchoTeclado = new Integer(_plantilla.getAnchoTeclado()).intValue();
		int nColumnas = new Integer(_plantilla.getNumeroColumnas()).intValue();
		int altoTeclado = new Integer(_plantilla.getAltoTeclado()).intValue();
		int nFilas = new Integer(_plantilla.getNumeroFilas()).intValue();
		int filasOcupa;
		int colsOcupa;
		int ancho = anchoTeclado/nColumnas;
		int alto = altoTeclado/nFilas;
		
    	for(int z = 0; z < _listaBotones.size(); z++){
    		BotonPersonalizado _boton = Util.BotonPreview(_listaBotones.get(z),_frame,_contenedor);
    		filasOcupa = new Integer(_boton.getBotonInfo().getFilasOcupa()).intValue();
    		colsOcupa = new Integer(_boton.getBotonInfo().getColumnasOcupa()).intValue();
    		ancho = anchoTeclado/nColumnas;
    		alto = altoTeclado/nFilas;
    		ancho = ancho*colsOcupa;
    		alto = alto*filasOcupa;
    		_boton.setPreferredSize(new Dimension(ancho,alto));
    		_boton.setSize(new Dimension(ancho,alto));
    		ImageIcon imagenicono;
    		if(_boton.getBotonInfo().getNombreIconoFichero().contains("/")){
        		imagenicono = new ImageIcon(_boton.getBotonInfo().getNombreIconoFichero());

    		}else{
    			
    		imagenicono = new ImageIcon(Configuracion.instancia().getDirUsuarioActual() + "//" +Configuracion.instancia().getTecladoActual() + "//" + _boton.getBotonInfo().getNombreIconoFichero());
    		
    		}
    	if(imagenicono.getIconHeight()>0){
        	int altoImagen = imagenicono.getIconHeight();
        	int anchoImagen = imagenicono.getIconWidth();
        	double factorEscala;
        	
        	if(ancho >= alto){
        		
        			
                	factorEscala = (altoImagen/(double)((80*_boton.getHeight())/100));

            		anchoImagen = ((int) (anchoImagen / factorEscala));
            		altoImagen = ((int) (80*_boton.getHeight())/100);

            		if(anchoImagen>_boton.getWidth()){
            			
                    	factorEscala =(anchoImagen/(double)((80*_boton.getWidth())/100));

                		anchoImagen =  ((int) (80*_boton.getWidth())/100);
                		altoImagen = ((int) (altoImagen / factorEscala));

            		}

        		
        	}else{
        		
        			
                	factorEscala =(anchoImagen/(double)((80*_boton.getWidth())/100));

            		anchoImagen =  ((int) (80*_boton.getWidth())/100);
            		altoImagen = ((int) (altoImagen / factorEscala));

            		if(anchoImagen>_boton.getWidth()){
            			
                    	factorEscala = (altoImagen/(double)((80*_boton.getHeight())/100));

                		anchoImagen = ((int) (anchoImagen / factorEscala));
                		altoImagen = ((int) (80*_boton.getHeight())/100);

            		}
            		
        		
        	}
        	
    		
    		Image redimensionada = imagenicono.getImage().getScaledInstance(anchoImagen,altoImagen, Image.SCALE_DEFAULT);
    		imagenicono = new ImageIcon(redimensionada);
    				
    		_boton.getLabelImagen().setIcon(imagenicono);
    		_boton.getLabelImagen().setPreferredSize(new Dimension(anchoImagen,altoImagen));
    	}else{
    		
    		imagenicono = new ImageIcon("lib//transparente.png");
    		//imagenicono = new ImageIcon("lib//Aceptar.png");

    		int altoImagen = imagenicono.getIconHeight();
        	int anchoImagen = imagenicono.getIconWidth();
        	double factorEscala;
        	
    		anchoImagen = ((int) (80*_boton.getWidth()) / 100);
    		altoImagen = ((int) (80*_boton.getHeight())/100);
    		
        	
           /*	if(ancho >= alto){
        		
    			
            	factorEscala = (altoImagen/(double)((80*_boton.getHeight())/100));

        		anchoImagen = ((int) (anchoImagen / factorEscala));
        		altoImagen = ((int) (80*_boton.getHeight())/100);

        		if(anchoImagen>_boton.getWidth()){
        			
                	factorEscala =(anchoImagen/(double)((80*_boton.getWidth())/100));

            		anchoImagen =  ((int) (80*_boton.getWidth())/100);
            		altoImagen = ((int) (altoImagen / factorEscala));

        		}


    	}else{
    		
    			
            	factorEscala =(anchoImagen/(double)((80*_boton.getWidth())/100));

        		anchoImagen =  ((int) (80*_boton.getWidth())/100);
        		altoImagen = ((int) (altoImagen / factorEscala));

        		if(anchoImagen>_boton.getWidth()){
        			
                	factorEscala = (altoImagen/(double)((80*_boton.getHeight())/100));

            		anchoImagen = ((int) (anchoImagen / factorEscala));
            		altoImagen = ((int) (80*_boton.getHeight())/100);
            		System.out.println("el tamaño de la imagen es : " + anchoImagen + " , " + altoImagen);

        		}
        		
    		
    	}
    		*/

    		Image redimensionada = imagenicono.getImage().getScaledInstance(anchoImagen,altoImagen, Image.SCALE_DEFAULT);
    		imagenicono = new ImageIcon(redimensionada);
    		_boton.getLabelImagen().setIcon(imagenicono);
    		//_boton.getLabelImagen().setPreferredSize(new Dimension(anchoImagen,altoImagen));
    		
    	}
    		
    		
    		_boton.addMouseListener(new AccionSoltarBoton(this));
    		//_boton.setFocusable(true);
    		//_boton.addKeyListener(new AccionTecladoEliminarBoton(_frame));
    		_boton.addMouseMotionListener(new AccionArrastrarBoton(this));
    		botones.add(_boton);
    	}
    	
    	for(int i=0; i<_listaBotones.size(); i++){
    		c.gridx = new Integer(_listaBotones.get(i).getPosicionColumna()).intValue();
    		c.gridy = new Integer(_listaBotones.get(i).getPosicionFila()).intValue();
    		c.gridwidth = new Integer(_listaBotones.get(i).getColumnasOcupa()).intValue();
    		c.gridheight = new Integer(_listaBotones.get(i).getFilasOcupa()).intValue();

    		gridbag.setConstraints(botones.get(i), c);
    		add(botones.get(i)); 
    		_matrizBotones[c.gridy][c.gridx] = botones.get(i);
    	}
    	
		ancho = anchoTeclado/nColumnas;
		alto = altoTeclado/nFilas;
    	
    	for(int j=0;j<_botonesEliminados.size();j++){
    		c.gridx = _botonesEliminados.get(j).getColumna();
    		c.gridy = _botonesEliminados.get(j).getFila();
    		c.gridwidth = _botonesEliminados.get(j).getColsOcupa();
    		c.gridheight = _botonesEliminados.get(j).getFilasOcupa();

    		if(c.gridy>(_numFilas-1)){
    			
    		}else{
    			if(c.gridx>(_numColumnas-1)){
    	    		
    			}else{
    				//PanelBotonEliminado b = new PanelBotonEliminado(c,_frame,_contenedor);
    		    	PanelBotonEliminado b = _botonesEliminados.get(j);
    		    	b.setPreferredSize(new Dimension(ancho,alto));
    		    	b.setSize(new Dimension(ancho,alto));

    		    	ImageIcon imagenicono = new ImageIcon("lib//transparente.png");
    	    		//ImageIcon imagenicono = new ImageIcon("lib//Aceptar.png");

    	    		int altoImagen = imagenicono.getIconHeight();
    	        	int anchoImagen = imagenicono.getIconWidth();
    	        	double factorEscala;
	        		anchoImagen = ((int) (80*b.getWidth()) / 100);
	        		altoImagen = ((int) (80*b.getHeight())/100);
	        		

    	           /*	if(ancho >= alto){
    	        		
    	    			
    	            	factorEscala = (altoImagen/(double)((80*b.getHeight())/100));

    	        		anchoImagen = ((int) (anchoImagen / factorEscala));
    	        		altoImagen = ((int) (80*b.getHeight())/100);

    	        		if(anchoImagen>b.getWidth()){
    	        			
    	                	factorEscala =(anchoImagen/(double)((100*b.getWidth())/100));

    	            		anchoImagen =  ((int) (80*b.getWidth())/100);
    	            		altoImagen = ((int) (altoImagen / factorEscala));
    	            		System.out.println("el tamaño de la imagen es : " + anchoImagen + " , " + altoImagen);

    	        		}


    	    	}else{
    	    		
    	    			
    	            	factorEscala =(anchoImagen/(double)((80*b.getWidth())/100));

    	        		anchoImagen =  ((int) (80*b.getWidth())/100);
    	        		altoImagen = ((int) (altoImagen / factorEscala));
    	        		System.out.println("el tamaño de la imagen es : " + anchoImagen + " , " + altoImagen);

    	        		if(anchoImagen>b.getWidth()){
    	        			
    	                	factorEscala = (altoImagen/(double)((80*b.getHeight())/100));

    	            		anchoImagen = ((int) (anchoImagen / factorEscala));
    	            		altoImagen = ((int) (80*b.getHeight())/100);
    	            		System.out.println("el tamaño de la imagen es : " + anchoImagen + " , " + altoImagen);

    	        		}
    	        		
    	    		
    	    	}*/
    	    		

    	    		Image redimensionada = imagenicono.getImage().getScaledInstance(anchoImagen,altoImagen, Image.SCALE_DEFAULT);
    	    		imagenicono = new ImageIcon(redimensionada);
    	    		b.getFoto().setIcon(imagenicono);
    		    	
    		    	
    		    	
    				gridbag.setConstraints(b, c);
    	    		add(b);
    			}
}
    		
    	}
    	refrescar();
    }

	public GridBagLayout getGridbag() {
		return gridbag;
	}

	public void setGridbag(GridBagLayout gridbag) {
		this.gridbag = gridbag;
	}

	public PlantillaTO get_plantilla() {
		return _plantilla;
	}

	public void set_plantilla(PlantillaTO plantilla) {
		_plantilla = plantilla;
		_frame.setTecladoTO(_plantilla);
	}

	public List<BotonTO> get_listaBotones() {
		return _listaBotones;
	}

	public void set_listaBotones(List<BotonTO> listaBotones) {
		_listaBotones = listaBotones;
	}

	public PaginaEntornoCreacionTeclados get_frame() {
		return _frame;
	}

	public void set_frame(PaginaEntornoCreacionTeclados frame) {
		_frame = frame;
	}

	public List<PanelBotonEliminado> get_botonesEliminados() {
		return _botonesEliminados;
	}

	public void set_botonesEliminados(List<PanelBotonEliminado> botonesEliminados) {
		_botonesEliminados = botonesEliminados;
	}

	public BotonPersonalizado getBotonArrastrado() {
		return botonArrastrado;
	}

	public void setBotonArrastrado(BotonPersonalizado botonArrastrado) {
		this.botonArrastrado = botonArrastrado;
	}

	public Boolean getArrastrando() {
		return arrastrando;
	}

	public void setArrastrando(Boolean arrastrando) {
		this.arrastrando = arrastrando;
	}

	public Point getOrigen() {
		return origen;
	}

	public void setOrigen(Point origen) {
		this.origen = origen;
	}
    
	public List<PanelBotonEliminado> detectarHuecos(PlantillaTO plantilla){
		
		List<PanelBotonEliminado> botonesEliminados = new ArrayList<PanelBotonEliminado>();
		List<BotonTO> botones = plantilla.getListaBotones();
		int filas = new Integer(plantilla.getNumeroFilas()).intValue();
		int cols = new Integer(plantilla.getNumeroColumnas()).intValue();
		int ancho = new Integer(plantilla.getAnchoTeclado()).intValue() /cols;
		int alto = new Integer(plantilla.getAltoTeclado()).intValue() /filas;
		int tamaño = 0;
		
		Boolean [][] _matrizBotones = new Boolean[filas][cols];
		for(int i=0;i<filas;i++){
			for(int j=0; j<cols;j++){
				_matrizBotones[i][j]=true;
				tamaño++;
			}
			
		}
		
		tamaño = 0;

		for(int i=0;i<botones.size();i++){
			int filaBoton = new Integer(botones.get(i).getPosicionFila()).intValue();
			int colBoton = new Integer(botones.get(i).getPosicionColumna()).intValue();
			int filasOcupa = new Integer(botones.get(i).getFilasOcupa()).intValue();
			int colsOcupa = new Integer(botones.get(i).getColumnasOcupa()).intValue();
			for(int j=0; j<filasOcupa;j++){
				for(int k=0;k<colsOcupa;k++){
					
					_matrizBotones[filaBoton+j][colBoton+k]=false;
					tamaño++;
				}
			}
			
			
			
		}
		botonesEliminados = poblarHuecos(_matrizBotones, botonesEliminados,filas, cols,ancho,alto);
		
		return botonesEliminados;
	}
    
	
	public List<PanelBotonEliminado> poblarHuecos(Boolean[][] matriz,List<PanelBotonEliminado> botonesEliminados, int filas, int cols, int ancho, int alto){
		GridBagConstraints cons = new GridBagConstraints();
     	cons.fill = GridBagConstraints.BOTH;
     	PanelBotonEliminado p;
		for(int i=0; i<filas;i++){
			for(int j=0; j<cols; j++){
				
				
				if(matriz[i][j]){
			     			cons.gridx = j;
			     			cons.gridy = i;
			     			cons.gridwidth = 1;
			     			cons.gridheight = 1;
			     			//PanelBotonEliminado p = new PanelBotonEliminado(cons,_frame, _frame.get_tecladoPrevisualizado(),ancho,alto);
			     			p = new PanelBotonEliminado(cons,ancho,alto);
			     			p.addMouseListener(new AccionSeleccionPanelEliminado(p,_frame,_frame.get_tecladoPrevisualizado()));

			     			botonesEliminados.add(p);
					
					
				}
				
			}
			
		}
		

		
		return botonesEliminados;
	}
	
}
